// package com.libc.yygh.common.utils;
//
//
//
// import com.libc.yygh.common.constant.IPubCons;
// import com.libc.yygh.common.constant.IPubEvnCons;
// import com.libc.yygh.common.exception.BusinessException;
//
// import java.util.*;
// import java.util.concurrent.ExecutionException;
//
// /**
//  * *   熙软科技：薪资计算公式，转换xml类
//  *
//  * @version 1.0<br>
//  * @packagename: com.xisoft.hr.test<br>
//  * @author: LiBencheng<br>
//  * @computer: licheng<br>
//  * @date: Created on 2021/9/30$16:39<br>
//  */
// public class FormulaConv
// {
//     public static void main(String[] args) throws ExecutionException, InterruptedException
//     {
//         // String updateSQL = SqlHelper.getUpdateSQL(SalaryDataVO.getTableName(), null, new HashMap()
//         // {{ put(SalaryDataVO.SALARY_DATA_ID, PubEnvUtil.EMPTY); }});
//         // System.out.println(updateSQL);
//         // String brace = "ROUND{F_2,0}";
//         // brace = "CEIL{ROUND{300.5,0}}";
//         // brace = "CEIL{800.6}-ROUND{300.5,0}";
//         // brace = "CEIL{ROUND{300.5,0}}-30";
//         // brace = "FLOOR{CEIL{ROUND{300.5,0}}}";
//         // brace = "FLOOR{CEIL{ROUND{300.5,0}}-30}";
//         // brace = "FLOOR{(CEIL{ROUND{300.5,0}-80})-30}";
//         // brace = "CEIL{500.5}-ROUND{300.5,0}";
//         // brace = "CEIL{ROUND{300.5,0}}-FLOOR{600.5}";
//         // brace = "CEIL{ROUND{300.5,0}-FLOOR{600.5}}";
//         // brace = "IF{3-6=5}THEN{55}ELSE{88}";
//         // brace = "IF{3-6=5}THEN{55}ELSEif{3-6=5}THEN{55}ELSE{88}";
//         // brace = "IF{(ROUND{600.6,0}-ROUND{600.6,0})>ROUND{600.6,0}}THEN{500-200}ELSE{400}";
//         // System.out.println(brace);
//         StringBuilder brace = new StringBuilder();
//         brace.append("");
//         brace.append("ROUND{");
//         brace.append("IF{(PERSON_CODE >'302027' and DEPT_ID <'c14e93bd-b489-6932-0491-9b5899c4fb81' ");
//         brace.append("and PERSON_NUMBER <>'510102196410036125')and (ISABLE ='0' or ISABLE is null) ");
//         brace.append("and PERSON_TYPE <>'a7ff7408-ba96-4a2a-a2b0-6b697b9ee8c4'}THEN{(F_1+F_2+F_3+F_4)*0.005}");
//         brace.append("ELSE_IF{(PERSON_CODE<>'302027' and DEPT_ID <>'c14e93bd-b489-6932-0491-9b5899c4fb81' ");
//         brace.append("and PERSON_NUMBER <>'510102196410036125')and (ISABLE='0' or ISABLE is null) ");
//         brace.append("and PERSON_TYPE ='a7ff7408-ba96-4a2a-a2b0-6b697b9ee8c4'}THEN{(F_2+F_3+F_5)*0.005}");
//         brace.append("ELSE_IF{(PERSON_CODE<>'302027' and DEPT_ID<>'c14e93bd-b489-6932-0491-9b5899c4fb81' ");
//         brace.append("and PERSON_NUMBER<>'510102196410036125') and(ISABLE='1' and XUELI='07')}THEN{" +
//                              "('1420'+F_5+F_67+F_56)*0.005}");
//         brace.append("ELSE_IF{(PERSON_CODE<>'302027' and DEPT_ID<>'c14e93bd-b489-6932-0491-9b5899c4fb81' ");
//         brace.append("and PERSON_NUMBER<>'510102196410036125') and(ISABLE='1' and XUELI='04')}THEN{" +
//                              "('1660'+F_53+F_56+F_324)*0.005}");
//         brace.append("ELSE_IF{(PERSON_CODE<>'302027' and DEPT_ID<>'c14e93bd-b489-6932-0491-9b5899c4fb81' ");
//         brace.append("and PERSON_NUMBER<>'510102196410036125') and(ISABLE='1' and XUELI='03')}THEN{" +
//                              "('1780'+F_24+F_38+F_21)*0.005}");
//         brace.append("ELSE_IF{(PERSON_CODE<>'302027' and DEPT_ID<>'c14e93bd-b489-6932-0491-9b5899c4fb81' ");
//         brace.append("and PERSON_NUMBER<>'510102196410036125') and(ISABLE='1' and XUELI='02')}THEN{" +
//                              "('2170'+F_23+F_49+F_102)*0.005}");
//         brace.append("ELSE_IF{(PERSON_CODE<>'302027' and DEPT_ID<>'c14e93bd-b489-6932-0491-9b5899c4fb81' ");
//         brace.append("and PERSON_NUMBER<>'510102196410036125') and(ISABLE='1' and XUELI='01')}THEN{" +
//                              "('2400'+F_35+F_47+F_24)*0.005}ELSE{0},2}");
//
//
//         leftIndexMap = new HashMap< Integer,Integer >();
//         leftToRightMap = new HashMap< Integer,Integer >();
//         String formulaStr = brace.toString();
//
//         // formulaStr = "if{0<3<2}then{1111}\n" +
//         //         "elseif{0='2'}then{2222}\n" +
//         //         "elseif{0='2'}then{3333}\n" +
//         //         "elseif{0='0'}then{4444}\n" +
//         //         "else{0000}";
//         formulaStr = "if{0<3<2}then{1111}elseif{0='0'}then{4444}else{0000}";
//         // formulaStr = "if{(alu{0-0}=0) and (0='f6ef4aa9-86b6-4484-8e97-a248952091da' ," +
//         //         "'cc95da72-017d-4237-bb14-b330275ffb94')}then{0*0.005}else{0}";
//
//
//         // formulaStr = "alu{123+12}";
//         // formulaStr = "if{123+12}";
//         // formulaStr = "then{123+12}";
//         // formulaStr = "elseif{123+12}";
//
//         // formulaStr = "if{0='2'}then{2222}else{0000}";
//         // formulaStr = "if{0='2'}then{1111}elseif{0='2'}then{2222}else{0000}";
//
//         formulaStr = convFormulaStr(formulaStr);
//         System.out.println(formulaStr);
//         System.out.println(formulaStr);
//     }
//
//     /** 左边括号的下标 */
//     static HashMap< Integer,Integer > leftIndexMap = null;
//     /** 对应右边括号的下标 */
//     static HashMap< Integer,Integer > leftToRightMap = null;
//
//     public static String convFormulaStr(String formulaStr)
//     {
//         if (PubEnvUtil.isEmpty(formulaStr)) { return formulaStr; }
//         leftIndexMap = new HashMap();
//         leftToRightMap = new HashMap();
//         formulaStr = handleSpecialSymbol(formulaStr);
//         chenkBrace(formulaStr);
//         formulaStr = parseBrace(formulaStr);
//         if (!formulaStr.startsWith(ISalaryCons.DATA_XML))
//         { formulaStr = genXmlFragment(formulaStr, ISalaryCons.DATA); }
//
//         return formulaStr;
//     }
//
//     /************************************************************* <br>
//      *
//      *说明: 处理<>,<,>  符号</,></><br>
//      *
//      * @Description   <br>
//      * @Date Created on 2021/9/30  16:34  <br>
//      * @Param [formulaStr] <br>
//      * @return java.lang.String  <br>
//      * @Author LIBENCHENG
//      * @version 1.0 <br>
//      ************************************************************* <br>
//      */
//     private static String handleSpecialSymbol(String formulaStr)
//     {
//         formulaStr = formulaStr.toLowerCase()
//                                .replace(IPubCons.UNEQUALS2, IPubCons.UNEQUALS)
//                                .replace("\n", IPubCons.EMPTY);
//         // .replace(ISalaryCons.ELSE_IF, ISalaryCons.WHEN);
//         char[] chars = formulaStr.toCharArray();
//         List< Integer > chevIndexList = new LinkedList< Integer >();
//         for (int i = 0; i < chars.length; i++)
//         { if (chars[i] == '<' || chars[i] == '>') { chevIndexList.add(i); } }
//         // 使用Collections.reverse()方法反转
//         Collections.reverse(chevIndexList);
//         for (int i = 0; i < PubEnvUtil.getSize(chevIndexList); i++)
//         {
//             Integer chevIndex = chevIndexList.get(i);
//             String subStartStr = formulaStr.substring(0, chevIndex);
//             // 判斷函数尾部
//             String subEndStr = formulaStr.substring(chevIndex);
//             if (subEndStr.startsWith(IPubCons.RIGHT_CHEV))
//             {
//                 formulaStr =
//                         (subStartStr + "<![CDATA[" + IPubCons.RIGHT_CHEV) + "]]>"
//                                 + subEndStr.substring(1, subEndStr.length());
//             }
//             if (subEndStr.startsWith(IPubCons.LEFT_CHEV))
//             {
//                 formulaStr = (subStartStr + "<![CDATA[" + IPubCons.LEFT_CHEV) + "]]>"
//                         + subEndStr.substring(1, subEndStr.length());
//             }
//         }
//
//         return formulaStr.replace(FunTimeEnum.NOW_DATE.getFunName()
//                 , genXmlFragment(FunTimeEnum.NOW_DATE.getFunName()
//                         , FunTimeEnum.SYS_DATE.getFunName()));
//     }
//
//     /************************************************************* <br>
//      *
//      *说明:校验公式的括号等 <br>
//      *
//      * @Description   <br>
//      * @Date Created on 2021/9/30  15:59  <br>
//      * @Param [formulaStr] <br>
//      * @return java.lang.String  <br>
//      * @Author LIBENCHENG
//      * @version 1.0 <br>
//      ************************************************************* <br>
//      */
//     public static String chenkBrace(String formulaStr)
//     {
//
//         // 只要字符串中任意两个相邻字符是此集合中的一个，即不符合，无效；
//         List< String > wuxiaokulist = Arrays.asList("[)", "[}", "(]", "(}", "{]", "{)");
//         String[] wuxiaoshou = {")", "]", "}"};
//         List< String > wuxiaoshoulist = Arrays.asList(")", "]", "}");
//         // 只要字符串中尾字符是此集合中的一个，即不符合，无效；
//         List< String > wuxiaoweilist = Arrays.asList("(", "[", "{");
//         List< Integer > left_brace_index = new LinkedList< Integer >();
//         List< Integer > right_brace_index = new LinkedList< Integer >();
//         char[] chars = formulaStr.toCharArray();
//         int small_Left = 0, small_Right = 0, middle_Left = 0, middle_Right = 0, large_Left = 0, large_Right = 0;
//
//         for (int i = 0; i < chars.length; i++)
//         {
//             char aChar = chars[i];
//             if (aChar == '(')
//             { small_Left++; }
//             if (aChar == ')')
//             { small_Right++; }
//             if (aChar == '[')
//             { middle_Left++; }
//             if (aChar == ']')
//             { middle_Right++; }
//             if (aChar == '{')
//             {
//                 large_Left++;
//                 left_brace_index.add(i);
//             }
//             if (aChar == '}')
//             {
//                 large_Right++;
//                 right_brace_index.add(i);
//             }
//         }
//         // System.out.println("small_Left: " + small_Left);
//         // System.out.println("small_Right: " + small_Right);
//         // System.out.println("middle_Left: " + middle_Left);
//         // System.out.println("middle_Right: " + middle_Right);
//         // System.out.println("large_Left: " + large_Left);
//         // System.out.println("large_Right: " + large_Right);
//
//         // 只要同一类型括号左右括号的数量不等则不符合，无效；
//         checkAssert(small_Left != small_Right,
//                     "small_Left: " + small_Left + "，small_Right: " + small_Right + ISalaryMsg.FORMULA_SBRACE_ERROR);
//         checkAssert(middle_Left != middle_Right,
//                     "middle_Left: " + middle_Left + "，middle_Right: " + middle_Right + ISalaryMsg.FORMULA_MBRACE_ERROR);
//         checkAssert(large_Left != large_Right,
//                     "large_Left: " + large_Left + "，large_Right: " + large_Right + ISalaryMsg.FORMULA_LBRACE_ERROR);
//
//         // 若同一类型括号左右括号的数量均对应相等，继续判断；
//         String str;
//         for (int i = 0; i < formulaStr.length() - 1; i++)
//         {
//             if (formulaStr.length() == 2)
//             { str = formulaStr; }
//             else
//             {
//                 if (i == formulaStr.length() - 2)
//                 { str = formulaStr.substring(i); }
//                 else { str = formulaStr.substring(i, i + 2); }
//             }
//             // 只要字符串中任意两个相邻字符是无效库集合中的一个，即不符合，无效；
//             checkAssert(wuxiaokulist.contains(str), ISalaryMsg.FORMULA_BRACE_ERROR);
//         }
//
//         return formulaStr;
//     }
//
//     /************************************************************* <br>
//      *
//      *说明: 生成xml文档,解析大括号<br>
//      *
//      * @Description   <br>
//      * @Date Created on 2021/4/2  23:50  <br>
//      * @param formulaStr <br>
//      * @return java.lang.String  <br>
//      * @Author LIBENCHENG
//      * @version 1.0 <br>
//      ************************************************************* <br>
//      */
//     private static String parseBrace(String formulaStr)
//     {
//         int large_Left = 0, large_Right = 0;
//         char[] chars = formulaStr.toCharArray();
//         int left_num = -1, right_num = -1;
//         HashMap< Integer,Integer > indexMap = new HashMap< Integer,Integer >();
//         for (int i = 0; i < chars.length; i++)
//         {
//             char aChar = chars[i];
//             if (aChar == '{')
//             {
//                 large_Left++;
//                 left_num = i;
//                 indexMap.put(large_Left, left_num);
//                 leftIndexMap.put(large_Left, left_num);
//             }
//             if (aChar == '}')
//             {
//                 large_Right++;
//                 right_num = i;
//             }
//             if (large_Left != 0 && large_Right != 0)
//             {
//                 if (large_Left > large_Right) { left_num = indexMap.get(large_Left); }
//                 leftToRightMap.put(left_num, right_num);
//
//                 if (formulaStr.contains(IPubEvnCons.LEFT_BRACE) && formulaStr.contains(IPubEvnCons.RIGHT_BRACE))
//                 {
//                     formulaStr = genXmlFragment(formulaStr, left_num, right_num);
//                     formulaStr = parseBrace(formulaStr);
//                     large_Left = -1;
//                     large_Right = 0;
//                     left_num = -1;
//                     right_num = -1;
//                     indexMap.clear();
//                 }
//             }
//         }
//         return formulaStr;
//     }
//
//
//     /************************************************************* <br>
//      *
//      *说明: 生成xml片段<br>
//      *
//      * @Description   <br>
//      * @Date Created on 2021/9/30  15:01  <br>
//      * @param formulaStr   公式串
//      * @param leftIndex    函数左边“{”下标
//      * @param rightIndex   函数右边“}”下标<br>
//      * @return java.lang.String  <br>
//      * @Author LIBENCHENG
//      * @version 1.0 <br>
//      ************************************************************* <br>
//      */
//     public static String genXmlFragment(String formulaStr, int leftIndex, int rightIndex)
//     {
//         String xmLabelStr = "";
//         // 函数头
//         String startStr = formulaStr.substring(0, leftIndex);
//         // 函数内容  middle
//         String midStr = formulaStr.substring(leftIndex + 1, rightIndex);
//         // 函数尾部
//         String subEndStr = formulaStr.substring(rightIndex + 1, formulaStr.length());
//         if (PubEnvUtil.isEmpty(midStr))
//         { throw new BusinessException(formatErrStr(ISalaryMsg.FORMULA_FUN_ERROR2)); }
//         // 處理子表信息
//         if (startStr.endsWith(FunOhterEnum.GETSUBVALUE.getFunName()))
//         { xmLabelStr = genXmlFragment(FunOhterEnum.GETSUBVALUE.getFunName(), midStr, startStr, subEndStr); }
//         // 日期函数
//         else if (startStr.endsWith(FunTimeEnum.TO_DATE.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.TO_DATE.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.TO_YEAR.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.TO_YEAR.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.TO_MONTH.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.TO_MONTH.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.TO_DAY.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.TO_DAY.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.ADD_YEAR.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.ADD_YEAR.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.ADD_MONTH.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.ADD_MONTH.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.ADD_DAY.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.ADD_DAY.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.LAST_DAY.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.LAST_DAY.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.BEGIN_DATE.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.BEGIN_DATE.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.BETWEEN_YEAR.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.BETWEEN_YEAR.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.BETWEEN_MONTH.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.BETWEEN_MONTH.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.BETWEEN_DAY.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.BETWEEN_DAY.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunTimeEnum.BETWEEN_DATE.getFunName()))
//         { xmLabelStr = genXmlFragment(FunTimeEnum.BETWEEN_DATE.getFunName(), midStr, startStr, subEndStr); }
//         // 如果ifelse函数需要运算使用她
//         else if (startStr.endsWith(FunMathEnum.ALU.getFunName()))
//         { xmLabelStr = genXmlFragment(FunMathEnum.ALU.getFunName(), midStr, startStr, subEndStr); }
//         // 数学函数
//         else if (startStr.endsWith(FunMathEnum.ABS.getFunName()))
//         { xmLabelStr = genXmlFragment(FunMathEnum.ABS.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunMathEnum.CEIL.getFunName()))
//         { xmLabelStr = genXmlFragment(FunMathEnum.CEIL.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunMathEnum.FLOOR.getFunName()))
//         { xmLabelStr = genXmlFragment(FunMathEnum.FLOOR.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunMathEnum.ROUND.getFunName()))
//         { xmLabelStr = genXmlFragment(FunMathEnum.ROUND.getFunName(), midStr, startStr, subEndStr); }
//         // 字符判空函数
//         else if (startStr.endsWith(FunOhterEnum.ISNULL.getFunName()))
//         { xmLabelStr = genXmlFragment(FunOhterEnum.ISNULL.getFunName(), midStr, startStr, subEndStr); }
//         // 字符串截取函数
//         else if (startStr.endsWith(FunOhterEnum.SUBSTRING.getFunName()))
//         { xmLabelStr = genXmlFragment(FunOhterEnum.SUBSTRING.getFunName(), midStr, startStr, subEndStr); }
//         // if{}then{}else{}函数
//         else if (startStr.endsWith(FunOhterEnum.ELSE_IF.getFunName()))
//         { xmLabelStr = genXmlFragment(FunOhterEnum.ELSE_IF.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunOhterEnum.IF.getFunName()))
//         { xmLabelStr = genXmlFragment(FunOhterEnum.IF.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunOhterEnum.THEN.getFunName()))
//         { xmLabelStr = genXmlFragment(FunOhterEnum.THEN.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(FunOhterEnum.ELSE.getFunName()))
//         { xmLabelStr = genXmlFragment(FunOhterEnum.ELSE.getFunName(), midStr, startStr, subEndStr); }
//         else if (startStr.endsWith(ISalaryCons.WHEN))
//         { xmLabelStr = genXmlFragment(ISalaryCons.WHEN, midStr, startStr, subEndStr); }
//         // 其他 error 标签
//         else { xmLabelStr = genXmlFragment(ISalaryCons.ERROR, midStr, startStr, subEndStr); }
//
//         return xmLabelStr;
//     }
//
//     /************************************************************* <br>
//      *
//      *说明: <br>
//      *
//      * @Description   <br>
//      * @Date Created on 2021/4/2  22:56  <br>
//      * @param funName   函数名称
//      * @param funBody   函数内容
//      * @param subStartStr  函数前面内容
//      * @param subEndStr   函数后面内容 <br>
//      * @return java.lang.String  <br>
//      * @Author LIBENCHENG
//      * @version 1.0 <br>
//      ************************************************************* <br>
//      */
//     public static String genXmlFragment(String funName, String funBody, String subStartStr, String subEndStr)
//     {
//         return StringUtil.toString(
//                 new StringBuilder()
//                         .append(beforeStr(subStartStr, funName))
//                         .append(genXmlFragment(funBody, funName))
//                         .append(subEndStr));
//     }
//
//     /************************************************************* <br>
//      *
//      *说明: <label> funBodyStr </label><br>
//      *
//      * @Description   <br>
//      * @Date Created on 2021/4/2  22:53  <br>
//      * @param funBodyStr  函数内容
//      * @param label xml标签<br>
//      * @return java.lang.String  <br>
//      * @Author LIBENCHENG
//      * @version 1.0 <br>
//      ************************************************************* <br>
//      */
//     public static String genXmlFragment(String funBodyStr, String label)
//     {
//         return StringUtil.toString(
//                 new StringBuilder()
//                         .append(IPubEvnCons.LEFT_CHEV)
//                         .append(label)
//                         .append(IPubCons.RIGHT_CHEV)
//                         .append(funBodyStr)
//                         .append(IPubEvnCons.LEFT_CHEV)
//                         .append(IPubEvnCons.SLASH)
//                         .append(label)
//                         .append(IPubEvnCons.RIGHT_CHEV));
//     }
//
//     public static String beforeStr(String subStr, String splitStr)
//     { return subStr.substring(0, subStr.length() - splitStr.length()); }
//
//
//     public static String formatErrStr(String msg)
//     {
//         return StringUtil.toString(
//                 new StringBuilder(ISalaryMsg.FORMULA_ERROR)
//                         .append("详细信息：[")
//                         .append(msg)
//                         .append("] "));
//     }
//
//     private static void checkAssert(boolean judge, String message) throws RuntimeException
//     { if (judge) { throw new RuntimeException(formatErrStr(message)); } }
//
// }